package com.ycz.algorithm.utils.list;

import java.util.Arrays;

/**
 * @author yancz
 * @ClassName MyList
 * @description: 列表实现
 * @date 2024-11-19 16:37:20
 * @version: 1.0
 */
public class MyList {

    private int[] arr; // 数组，存储列表元素

    private int capacity = 10; // 列表容量

    private int size = 0; // 列表长度，当前元素数量

    private int extendRatio = 2; // 每次列表扩容的倍数

    // 构造方法，初始化容量为10
    public MyList() {
        arr = new int[capacity];
    }

    // 获取列表长度
    public int size() {
        return size;
    }

    // 获取列表容量
    public int capacity() {
        return capacity;
    }

    // 访问元素
    public int get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("索引越界");
        }
        return arr[index];
    }

    // 更新元素
    public void set(int index, int num) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("索引越界");
        }
        arr[index] = num;
    }

    // 添加元素
    public void add(int num) {
        if (size == capacity()) {
            extendCapacity();
        }
        arr[size] = num;
        // 更新元素数量
        size++;
    }

    // 列表中间插入元素
    public void add(int index, int num) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("索引越界");
        }
        // 元素数量超出容量，则扩容
        if (size == capacity()) extendCapacity();
        // 索引index以及之后的元素向后移动一位
        for (int j = size - 1; j >= index; j--) {
            arr[j + 1] = arr[j];
        }
        arr[index] = num;
        // 数量更新
        size++;
    }

    // 元素删除
    public int remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("索引越界");
        }
        int num = arr[index];
        // 将index之后的元素全部移动一位
        for (int j = index; j < size - 1; j++) {
            arr[j] = arr[j + 1];
        }
        // 元素数量更新
        size--;
        // 返回被删除的元素
        return num;
    }

    // 列表转为数组
    public int[] toArray() {
        int size = size();
        int[] arr = new int[size];
        for (int i = 0; i < size; i++) {
            arr[i] = get(i);
        }
        return arr;
    }


    // 列表扩容
    public void extendCapacity() {
        // 新建一个长度为原数组extendRatio倍数的新数组，并将原数组元素复制到新数组中
        arr = Arrays.copyOf(arr, capacity() * extendRatio);
        // 更新列表容量
        capacity = arr.length;
    }
}
